<?php
// 应用公共文件
/**
 * 获取客户端IP地址
 * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
 * @param boolean $adv 是否进行高级模式获取（有可能被伪装）
 * @return mixed
 */
function get_client_ip($type = 0,$adv=false) {
    $type       =  $type ? 1 : 0;
    static $ip  =   NULL;
    if ($ip !== NULL) return $ip[$type];
    if($adv){
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $arr    =   explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            $pos    =   array_search('unknown',$arr);
            if(false !== $pos) unset($arr[$pos]);
            $ip     =   trim($arr[0]);
        }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $ip     =   $_SERVER['HTTP_CLIENT_IP'];
        }elseif (isset($_SERVER['REMOTE_ADDR'])) {
            $ip     =   $_SERVER['REMOTE_ADDR'];
        }
    }elseif (isset($_SERVER['REMOTE_ADDR'])) {
        $ip     =   $_SERVER['REMOTE_ADDR'];
    }
    // IP地址合法验证
    $long = sprintf("%u",ip2long($ip));
    $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);
    return $ip[$type];
}

/**
 * 无限分类主函数
 * @param array $data 导航数据列表
 * @param array $result 返回的数组
 * @param string $field 父级id字段
 * @param int $pid 开始循环的根id
 * @param string $key 主键字段
 */
function get_level($data,&$result,$field,$pid,$id='id') {
	$level = [];
	foreach($data as $key=>$value){
		$level[$value[$field]][] = $value;
	}
	levels($level,$result,$field,$pid,1,$id);
}

/**
 * 无限分类缩小函数
 * @param array $data 导航数据列表 根据父id的二维数组
 * @param array $result 返回的数组
 * @param string $field 父级id字段
 * @param int $pid 开始循环的根id
 * @param string $key 主键字段
 * 调用 get_level($list,$level,'menu_id',0,'id');
 */
function levels($level,&$result,$field,$pid,$num,$id='id') {
	if(!empty($level[$pid])){
		foreach($level[$pid] as $key=>$value){
			$value['level'] = $num;
			$result[$value[$id]] = $value;
			if(!empty($level[$value[$id]])){
				levels($level,$result,$field,$value[$id],$num+1);
			}
		}
	}
}

/**
 * 根据当前id 返回面包穴导航 主函数
 * @param array $data 分类数组  
 * @param array $result 返回的数组
 * @param string $field 字符串
 * @param int $id 当前id
 * @param $k 主键字段
 * 调用 level_nav($list,$level,'menu_id',8);
 */
function level_nav($data,&$result,$field,$id,$k='id'){
	$level = [];
	foreach($data as $key=>$value){
		$level[$value[$k]] = $value;
	}
	level_navs($level,$result,$field,$id,$k);
	$arr = array_reverse($result);
	$result = $arr;
}

/**
 * 根据当前id 返回面包穴导航 主函数
 * @param array $level 分类数组  
 * @param array $result 返回的数组
 * @param string $field 字符串
 * @param int $id 当前id
 * @param $k 主键字段
 */
function level_navs($level,&$result,$field,$id,$k='id'){
	if(!empty($level[$id])){
		$nav = $level[$id];
		$result[$nav[$k]] = $nav;
		if(!empty($level[$nav[$field]])){
			level_navs($level,$result,$field,$nav[$field]);
		}
	}
}

/**
 * 根据层级输出空格
 */
function echolevel($level,$start="　",$end="╠"){
	$str = "";
	for($i=1;$i<$level;$i++){
		$str .= $start;
	}
	if(1 != $level){
		$str .= $end;
	}
	return $str;
}

/**
 * 函数解释：
 * msubstr($str, $start=0, $length, $charset=”utf-8″, $suffix=true)
 * $str:要截取的字符串
 * $start=0：开始位置，默认从0开始
 * $length：截取长度
 * $charset=”utf-8″：字符编码，默认UTF－8
 * $suffix=true：是否在截取后的字符后面显示省略号，默认true显示，false为不显示
 * 模版使用：{$vo.title|msubstr=0,5,'utf-8',false}
 */
function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)  
{  
	if(function_exists("mb_substr")){
		  if($suffix)  
		  return mb_substr($str, $start, $length, $charset)."...";  
		  else
			   return mb_substr($str, $start, $length, $charset);  
	 }  
	 elseif(function_exists('iconv_substr')) {  
		 if($suffix)  
			  return iconv_substr($str,$start,$length,$charset)."...";  
		 else
			  return iconv_substr($str,$start,$length,$charset);  
	 }  
	 $re['utf-8']   = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef]
			  [x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/";  
	 $re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/";  
	 $re['gbk']    = "/[x01-x7f]|[x81-xfe][x40-xfe]/";  
	 $re['big5']   = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/";  
	 preg_match_all($re[$charset], $str, $match);  
	 $slice = join("",array_slice($match[0], $start, $length));  
	 if($suffix) return $slice."…";  
	 return $slice;
}


/**
 * 检查左侧权限
 */
function checklefturl($lefts,$vo){
	$auth = new \liliuwei\think\Auth();
	$administrator = session('administrator');

	if(1 != $administrator['is_admin']){
		if(!empty($lefts[$vo['id']])){
			foreach($lefts[$vo['id']] as $kk=>$vv) {
				if ($auth->check(strtolower($vv['url']), $administrator['id'])) {
					return true;
				}
			}
			return false;
		} else {
			if (!$auth->check(strtolower($vo['url']), $administrator['id'])) {
				return false;
			}
		}
	}
	return true;

}

/**
 * 根据URL 检验权限是否正确 模板中用
 */
function checkurl($url){
	$auth = new \liliuwei\think\Auth();
	$administrator = session('administrator');

	if(1 != $administrator['is_admin']){
		if (!$auth->check(strtolower($url), $administrator['id'])) {
			return false;
		}
	}
	return true;
}

/**
 * textarea 回行
 */
function textareabr($str) {
	$strs = str_replace("\n","<br/>",$str);
	//$strs = str_replace("\r\n","==",$str);
	return $strs;
}

/**
 * 过滤掉emoji表情
 */
function filterEmoji($str)
{
   $str = preg_replace_callback('/./u',function (array $match) {
         return strlen($match[0]) >= 4 ? '' : $match[0];
      },$str);
   return $str;
}

/**
 * get 请求
 */
function curl_get_https($url){

    $curl = curl_init(); // 启动一个CURL会话

    curl_setopt($curl, CURLOPT_URL, $url);

    curl_setopt($curl, CURLOPT_HEADER, 0);

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查

    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);  // 从证书中检查SSL加密算法是否存在

    $tmpInfo = curl_exec($curl);     //返回api的json对象

    //关闭URL请求

    curl_close($curl);

    return $tmpInfo;    //返回json对象

}

/**
 * post 请求
 */
function curl_post_https($url,$data){ // 模拟提交数据函数

    $curl = curl_init(); // 启动一个CURL会话

    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址

    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查

    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在

    curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器

    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转

    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer

    curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求

    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包

    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环

    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回

    $tmpInfo = curl_exec($curl); // 执行操作

    if (curl_errno($curl)) {

        echo 'Errno'.curl_error($curl);//捕抓异常

    }

    curl_close($curl); // 关闭CURL会话

    return $tmpInfo; // 返回数据，json格式
}
